home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / probots.arc / NINJA.PR < prev    next >
Text File  |  1991-04-28  |  4KB  |  141 lines

  1.   PROCEDURE Ninja;
  2.  
  3.     { Author unknown }
  4.  
  5.     { Based on C-Robot Ninja }
  6.  
  7.     { Locks on to a target and attacks }
  8.  
  9.   VAR vector     : Integer; { current attack vector }
  10.  
  11.  
  12.     PROCEDURE charge(vec, Range, maxspd : Integer); { charge at an enemy }
  13.       { vec : attack vector to use }
  14.       { range : range to target }
  15.       { maxspd : maximum speed to use }
  16.     BEGIN 
  17.       IF (Range > 40) AND (Range < 800) THEN { good shooting range }
  18.         cannon(vec, Range); { fire! }
  19.       drive(vec, maxspd); { charge! }
  20.     END; { charge }
  21.  
  22.  
  23.     FUNCTION Pin(vec : Integer) : Integer; { pin down a target }
  24.       { vec :  initial vector }
  25.     VAR
  26.       tv             : Integer; { trial vector }
  27.       ts             : Integer; { trial scan results }
  28.       n              : Integer; { index }
  29.       return         : Integer;
  30.     BEGIN
  31.       tv := vec-10; { coarse screen }
  32.       n := 2;
  33.       ts := scan(tv, 10);
  34.       WHILE (n > 0) AND (ts = 0) DO
  35.         BEGIN
  36.           tv := tv+20;
  37.           n := n-1;
  38.           ts := scan(tv, 10);
  39.         END;
  40.       IF ts = 0
  41.       THEN return := 0
  42.       ELSE BEGIN
  43.         charge(tv, ts, 50);
  44.  
  45.         tv := tv-10; { medium screen }
  46.         n := 4;
  47.         ts := scan(tv, 5);
  48.         WHILE (n > 0) AND (ts = 0) DO
  49.           BEGIN
  50.             tv := tv+10;
  51.             n := n-1;
  52.             ts := scan(tv, 5);
  53.           END;
  54.  
  55.         IF ts = 0
  56.         THEN return := 0
  57.         ELSE BEGIN
  58.           charge(tv, ts, 50);
  59.  
  60.           tv := tv-4; { fine screen }
  61.           n := 3;
  62.           ts := scan(tv, 2);
  63.           WHILE (n > 0) AND (ts = 0) DO
  64.             BEGIN
  65.               tv := tv-4;
  66.               n := n-1;
  67.               ts := scan(tv, 2);
  68.             END;
  69.  
  70.           IF ts = 0
  71.           THEN return := 0
  72.           ELSE BEGIN { found it! }
  73.             return := ts; { say how far away it is }
  74.             vector := tv;
  75.           END;
  76.         END; { fine screen }
  77.       END; { medium screen }
  78.  
  79.       Pin := return;
  80.     END; { Pin }
  81.  
  82.  
  83.     PROCEDURE attack;
  84.     VAR
  85.       Range          : Integer; { range to locked target }
  86.       return         : Boolean;
  87.     BEGIN
  88.       return := False;
  89.       REPEAT
  90.         Range := scan(vector, 0);
  91.         IF (Range > 0)
  92.         THEN charge(vector, Range, 100) { got him! }
  93.         ELSE IF Pin(vector) = 0 THEN { lost him! }
  94.           return := True; { can't find him }
  95.       UNTIL return;
  96.     END; { Attack }
  97.  
  98.  
  99.     FUNCTION Find  : Integer; { find a new target }
  100.     VAR
  101.       off            : Integer; { offset }
  102.       dir            : Boolean; { direction }
  103.       tv             : Integer; { trial vector }
  104.       return         : Integer;
  105.  
  106.     BEGIN {Find}
  107.       off := 180; { half circle sweep }
  108.       dir := False; { counter-clockwise first }
  109.       tv := (vector+180) MOD 360; { look behind us first }
  110.       return := 0; {no target found - default}
  111.  
  112.       WHILE (off >= 0) AND (return = 0) DO { full scan }
  113.         BEGIN
  114.           IF (scan(tv, 10) > 0) THEN { see anyone? }
  115.             return := Pin(tv); { nail him! }
  116.           dir := NOT dir;
  117.           IF dir { alternate sides }
  118.           THEN BEGIN
  119.             off := off-20;
  120.             tv := vector+off;
  121.           END
  122.           ELSE tv := vector-off+360;
  123.           tv := tv MOD 360;
  124.         END;
  125.  
  126.       Find := return;
  127.     END; {Find}
  128.  
  129.  
  130.   BEGIN {Ninja Main}
  131.     vector := Random(360);
  132.     REPEAT
  133.       IF (speed = 0) THEN drive(vector, 30)
  134.       ELSE IF (Find > 0)
  135.       THEN attack { if we see anyone attack }
  136.       ELSE vector := Random(360);
  137.     UNTIL Dead OR Winner;
  138.   END; {Ninja Main}
  139.  
  140.  
  141.